/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package camada.bancodedados.daoimplemente.orcamento;

import camada.bancodedados.conexao.Conexao;
import camada.bancodedados.daoimplemente.cliente.PessoaFisicaDAOImpl;
import camada.negocio.dao.orcamento.OrcamentoDAO;
import eloma.classe.Cliente;
import eloma.classe.Pagamento;
import eloma.classe.orcamento.Orcamento;
import eloma.classe.orcamento.ProdutoOrcamento;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import utilitarios.Exceptions;

/**
 *
 * @author icaro.klinger
 */
public class OrcamentoDAOImpl implements OrcamentoDAO {

    //<editor-fold desc="Variáveis">
    PessoaFisicaDAOImpl daoCliente = new PessoaFisicaDAOImpl();
    ProdutoOrcamentoDAOImpl daoProdutoOrcamento = new ProdutoOrcamentoDAOImpl();
    PagamentoDAOImpl daoPagamento = new PagamentoDAOImpl();
    Exceptions exceptions = new Exceptions();
    //</editor-fold>

    @Override
    //<editor-fold desc="inserirOrcamento">
    public int inserirOrcamento(Orcamento orc) {
        int id = 0;
        PreparedStatement pstm = null;
        try {
            final String SQL_INSERT
                    = "insert into Orcamento(idCliente, idPagamento, data) values (?,?,?) ";
            pstm = Conexao.getCon().prepareStatement(SQL_INSERT);
            pstm.setInt(1, orc.getCliente().getIdCliente());
            pstm.setInt(2, orc.getPagamento().getIdPagamento());
            pstm.setDate(3, (Date) orc.getData());
            pstm.executeUpdate();

            String query = "select idOrcamento from Orcamento";
            ResultSet rs = pstm.executeQuery(query);

            while (rs.next()) {
                id = rs.getInt("idOrcamento");
            }

        } catch (SQLException e) {
            exceptions.Exceptions(e.getMessage(), "OrcamentoDAOImpl-InserirOrcamento");
            return 0;
        }

        return id;
    }
    //</editor-fold>

    @Override
    //<editor-fold desc="pesquisaOrcamentoPorIdentificadorCliente">
    public List<Orcamento> pesquisaOrcamentoPorIdentificadorCliente(int idCliente) throws Exception {
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            final String SQL_PESQUISA_CLIENTE = "select * from Orcamento where idCliente = ? ";
            stmt = Conexao.getCon().prepareStatement(SQL_PESQUISA_CLIENTE);
            stmt.setInt(1, idCliente);
            rs = stmt.executeQuery();
            return carregarMultiplosResultados(rs);
        } catch (SQLException sqle) {
            exceptions.Exceptions(sqle.getMessage(), "OrcamentoDAOImpl-pesquisaOrcamentoPorIdentificadorCliente");
            throw new Exception(sqle);
        } catch (Exception e) {
            exceptions.Exceptions(e.getMessage(), "OrcamentoDAOImpl-pesquisaOrcamentoPorIdentificadorCliente");
            throw new Exception(e);
        } finally {
        }
    }
    //</editor-fold>

    @Override
    //<editor-fold desc="atualizarOrcamento">
    public void atualizarOrcamento(Orcamento orc) {
        PreparedStatement pstm = null;
        try {
            final String SQL_UPDATE
                    = "UPDATE Orcamento SET idCliente = ? , idPagamento ?  WHERE idOrcamento = ?";
            pstm = (PreparedStatement) Conexao.getCon().prepareStatement(SQL_UPDATE);
            pstm.setInt(1, orc.getCliente().getIdCliente());
            pstm.setInt(2, orc.getPagamento().getIdPagamento());
            pstm.setInt(2, orc.getIdOrcamento());
            pstm.executeUpdate();
        } catch (SQLException e) {
            exceptions.Exceptions(e.getMessage(), "OrcamentoDAOImpl-atualizarOrcamento");
        }
    }
    //</editor-fold>

    @Override
    //<editor-fold desc="removerOrcamento">
    public void removerOrcamento(Orcamento orc) {
        PreparedStatement pstm = null;
        try {
            final String SQL_DELETE = "delete from Orcamento where idOrcamento = ?";
            pstm = (PreparedStatement) Conexao.getCon().prepareStatement(SQL_DELETE);
            pstm.setInt(1, orc.getIdOrcamento());
            pstm.executeUpdate();
        } catch (SQLException e) {
            exceptions.Exceptions(e.getMessage(), "OrcamentoDAOImpl-removerOrcamento");
        }

    }
    //</editor-fold>

    @Override
    //<editor-fold desc="pesquisarTodosOrcamentos">
    public List<Orcamento> pesquisarTodosOrcamentos() throws Exception {
        PreparedStatement stmt = null;
        ResultSet rs = null;
        String SQL_STATEMENT = "Select * from Orcamento";
        try {
            stmt = (PreparedStatement) Conexao.getCon().prepareStatement(SQL_STATEMENT);
            rs = stmt.executeQuery();
            return carregarMultiplosResultados(rs);
        } catch (SQLException sqle) {
            exceptions.Exceptions(sqle.getMessage(), "OrcamentoDAOImpl-pesquisarTodosOrcamentos");
            throw new Exception(sqle);
        } catch (Exception e) {
            exceptions.Exceptions(e.getMessage(), "OrcamentoDAOImpl-pesquisarTodosOrcamentos");
            throw new Exception(e);
        } finally {
        }
    }
    //</editor-fold>

    //<editor-fold desc="carregarMultiplosResultados">
    public List<Orcamento> carregarMultiplosResultados(ResultSet rs) throws SQLException {
        List<Orcamento> resultList = new ArrayList<Orcamento>();
        while (rs.next()) {
            Orcamento dto = new Orcamento();
            carregarVO(dto, rs);
            resultList.add(dto);
        }
        return resultList;
    }
    //</editor-fold>

    //<editor-fold desc="carregarResultadoSimples">
    private Orcamento carregarResultadoSimples(ResultSet rs) throws SQLException {
        if (rs.next()) {
            Orcamento dto = new Orcamento();
            carregarVO(dto, rs);
            return dto;
        } else {
            return null;
        }
    }
    //</editor-fold>

    //<editor-fold desc="carregarVO">
    private void carregarVO(Orcamento dto, ResultSet rs) throws SQLException {
        try {

            dto.setIdOrcamento(rs.getInt("idOrcamento"));
            dto.setData(rs.getDate("data"));

            //Busca Cliente
            Cliente cliente = daoCliente.buscaId(rs.getInt("idCliente"));
            dto.setCliente(cliente);

            //Busca Produtos orçamento
            List<ProdutoOrcamento> listaProdutoOrcamento = daoProdutoOrcamento.pesquisarProdutoOrcamentoPorIdentificadorOrcamento(rs.getInt("idOrcamento"));
            dto.setListaProdutoOrcamento(listaProdutoOrcamento);

            //Busca Pagamento
            Pagamento pagamento = daoPagamento.pesquisaPagamentoPorIdentificador(rs.getInt("idPagamento"));
            dto.setPagamento(pagamento);

        } catch (Exception e) {
            exceptions.Exceptions(e.getMessage(), "OrcamentoDAOImpl-carregarVO");
        }
    }
    //</editor-fold>
}
